package com.alibaba.citrus.cr.unified.inventory.contants;

import com.epoch.app.crunifiedinventory.model.dto.OrderCompareErrorResult;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class SaleDetailObjectCompareUtil {
    /**
     * 获取两个对象同名属性内容不相同的列表
     *
     * @param class1 对象1
     * @param class2 对象2
     * @return
     * @throws IllegalAccessException
     */
    public static List<OrderCompareErrorResult> compareTwoClassForSale(Object class1, Object class2) throws IllegalAccessException {
        List<OrderCompareErrorResult> list = new ArrayList<>();
        //获取对象的class
        Class<?> clazz1 = class1.getClass();
        Class<?> clazz2 = class2.getClass();
        //获得类中所有声明的字段，包括public、private和proteced，但是不包括父类的申明字段
        Field[] field1 = clazz1.getDeclaredFields();
        Field[] field2 = clazz2.getDeclaredFields();
        //遍历属性列表field1
        for (Field sourceField : field1) {
            //遍历属性列表field2
            for (Field targetFiled : field2) {
                //如果field1[i]属性名与field2[j]属性名内容相同
                if (sourceField.getName().equals(targetFiled.getName())) {
                    //如果两个字段的名称一样，那么我们就视为它俩是同一个字段
                    sourceField.setAccessible(true);
                    targetFiled.setAccessible(true);
                    //如果field1[i]属性值与field2[j]属性值内容不相同
                    if (!compareTwo(sourceField.get(class1), targetFiled.get(class2))) {
                        if (Objects.isNull(SaleCompareEnum.of(sourceField.getName()))){
                            continue;
                        }
                        OrderCompareErrorResult errorResult = OrderCompareErrorResult.builder()
                                .name(sourceField.getName())
                                .text(SaleCompareEnum.of(sourceField.getName()).getLabel())
                                .source(String.valueOf(sourceField.get(class1)))
                                .target(String.valueOf(targetFiled.get(class2)))
                                .build();
                        list.add(errorResult);
                    }
                    break;
                }
            }
        }

        return list;
    }

    //对比两个数据是否内容相同
    public static boolean compareTwo(Object object1, Object object2) {
       String source=String.valueOf(object1);
       String target=String.valueOf(object2);
        if ((StringUtils.isBlank(source) ||Objects.equals(source, "null"))&& (StringUtils.isBlank(target)||Objects.equals(target, "null"))) {
            return true;
        }

        return source.equals(target);
    }
}
